package com.hhc.controller;

import com.hhc.dto.FileDeleteDTO;
import com.hhc.dto.FileDownloadDTO;
import com.hhc.dto.FileUploadDTO;
import com.hhc.entity.FileResource;
import com.hhc.query.FileListQuery;
import com.hhc.service.FileResourceService;
import com.hhc.utils.RestResult;
import jakarta.validation.Valid;
import java.util.HashMap;
import java.util.Map;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.web.bind.annotation.*;

/**
 * 文件资源控制器
 *
 * @author pc
 */
@Slf4j
@RestController
@RequestMapping("/file")
@RequiredArgsConstructor
public class FileResourceController {

    private final FileResourceService fileResourceService;

    /**
     * 上传文件
     *
     * @param dto 文件上传信息
     * @return RestResult 结果
     */
    @PostMapping("/upload")
    public RestResult<?> uploadFile(@Valid @RequestBody FileUploadDTO dto) {
        log.info("收到上传文件请求");

        boolean success = fileResourceService.uploadFile(dto);
        if (!success) {
            return RestResult.failed("文件已存在");
        }

        Map<String, Object> data = new HashMap<>();
        data.put("originalName", dto.getOriginalName());
        data.put("storagePath", dto.getStoragePath());
        return RestResult.success(data);
    }

    /**
     * 下载文件
     *
     * @param dto 文件下载信息
     * @return RestResult 结果
     */
    @GetMapping("/download")
    public RestResult<?> downloadFile(@Valid FileDownloadDTO dto) {
        log.info("收到下载文件请求，ID为：{}", dto.getId());

        FileResource file = fileResourceService.downloadFile(dto);
        if (file == null) {
            return RestResult.failed("文件不存在");
        }

        return RestResult.success(file);
    }

    /**
     * 删除文件
     *
     * @param dto 文件删除信息
     * @return RestResult 结果
     */
    @DeleteMapping("/delete")
    public RestResult<?> deleteFile(@Valid @RequestBody FileDeleteDTO dto) {
        log.info("收到删除文件请求，ID为：{}", dto.getId());

        boolean success = fileResourceService.deleteFile(dto);
        if (!success) {
            return RestResult.failed("文件不存在");
        }

        return RestResult.success(null);
    }

    /**
     * 获取文件列表
     *
     * @param query 查询条件
     * @param page 页码
     * @param size 每页数量
     * @return RestResult 结果
     */
    @GetMapping("/list")
    public RestResult<?> getFileList(FileListQuery query,
                                     @RequestParam(defaultValue = "1") int page,
                                     @RequestParam(defaultValue = "10") int size) {
        log.info("收到获取文件列表请求");

        Pageable pageable = PageRequest.of(page - 1, size); // 转换为从零开始的页码
        Iterable<FileResource> files = fileResourceService.getFileList(query, pageable);

        Map<String, Object> data = new HashMap<>();
        data.put("files", files);
        data.put("totalPages", 1); // 这里应根据实际分页计算总页数

        return RestResult.success(data);
    }
}
